<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // * 创建一个空对象`obj`（`{}`）
    // * 将`obj`的`[__proto__]`属性指向构造函数的原型（即`obj.[[__proto__]] = constrc.prototype`）
    // * 将构造函数内部的`this`绑定到新建的对象`obj`，执行构造函数
    //   （也就是跟调用普通函数一样，只是此时函数的this为新创建的对象`obj`而已）
    // * 若构造函数没有返回非原始值（即不是引用类型的值），则返回该新建的对象`obj`
    //   （默认会添加`return this`）。否则，返回引用类型的值。
    function newInstance(Constructor){
        const obj = {};
        obj.__proto__ = Constructor.prototype;
        const result = Constructor.apply(obj,Array.from(arguments).slice(1));
        if(typeof result === "object" || typeof result === "function"){
            return result;
        }
        return obj;
    }

    function Box(userName,age){
        this.userName = userName;
        this.age = age;
        return [1,2,3];
    }
    const box = newInstance(Box,"zhangsan",12);// new Box("zhangsan",12)
    // console.log(box.__proto__ === Box.prototype);// true
    // console.log(box.userName)
    // console.log(box.age)
    console.log(box);

</script>
</html>